/**
 * 通用请求工具类
 * 提供 get、post 和 upload 方法
 */

  // 基础URL常量
const baseUrl = process.env.REACT_APP_API_BASE_URL || 'http://api.upbaobao.local';

/**
 * 检查响应是否为 JSON 格式
 * @param {Response} response - fetch API 的响应对象
 * @returns {Promise<any>} 解析后的 JSON 数据
 */
async function checkResponseStatus(response) {
  // 检查响应是否正常
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  // 检查返回内容是否为 JSON 格式
  const contentType = response.headers.get('content-type');
  if (!contentType || !contentType.includes('application/json')) {
    throw new Error('Response is not JSON format');
  }

  return await response.json();
}

/**
 * 统一处理响应数据
 * @param {Object} responseData - 从服务器返回的 JSON 数据
 * @returns {any} 返回数据中的 data 字段
 */
function handleResponseData(responseData) {
  // 检查 success 字段是否为 true
  if (!responseData.success) {
    // 如果 success 不为 true，检查是否有错误消息
    const message = responseData.msg || 'Request failed';
    // 将 msg 作为逻辑异常抛出
    throw new Error(message);
  }

  // 如果正常，返回 data 参数
  return responseData.data;
}

/**
 * 拼接完整URL
 * @param {string} url - 请求地址
 * @returns {string} 完整的请求地址
 */
function getFullUrl(url) {
  // 如果URL已经是完整URL，则直接返回
  if (url.startsWith('http://') || url.startsWith('https://')) {
    return url;
  }

  // 拼接基础URL和请求路径
  return `${baseUrl.replace(/\/$/, '')}/${url.replace(/^\//, '')}`;
}

/**
 * 通用 GET 请求方法
 * @param {string} url - 请求地址
 * @param {Object} params - 请求参数
 * @returns {Promise<any>} 处理后的数据
 */
export async function Get(url, params = {}) {
  // 构建完整URL
  const fullUrl = getFullUrl(url);

  // 构建查询参数
  const searchParams = new URLSearchParams(params);
  const finalUrl = searchParams.toString() ? `${fullUrl}?${searchParams}` : fullUrl;

  try {
    // 发起 GET 请求
    const response = await fetch(finalUrl, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    });

    // 检查响应状态并解析 JSON
    const jsonData = await checkResponseStatus(response);

    // 统一处理响应数据
    return handleResponseData(jsonData);
  } catch (error) {
    // 重新抛出错误，让调用方处理
    throw error;
  }
}

/**
 * 通用 POST 请求方法
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @returns {Promise<any>} 处理后的数据
 */
export async function Post(url, data = {}) {
  // 构建完整URL
  const fullUrl = getFullUrl(url);

  try {
    // 发起 POST 请求
    const response = await fetch(fullUrl, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    });

    // 检查响应状态并解析 JSON
    const jsonData = await checkResponseStatus(response);

    // 统一处理响应数据
    return handleResponseData(jsonData);
  } catch (error) {
    // 重新抛出错误，让调用方处理
    throw error;
  }
}

/**
 * 文件上传方法
 * @param {string} url - 上传地址
 * @param {FormData} formData - 包含文件的 FormData 对象
 * @returns {Promise<any>} 处理后的数据
 */
export async function Upload(url, formData) {
  // 构建完整URL
  const fullUrl = getFullUrl(url);

  try {
    // 发起文件上传请求
    const response = await fetch(fullUrl, {
      method: 'POST',
      body: formData,
    });

    // 检查响应状态并解析 JSON
    const jsonData = await checkResponseStatus(response);

    // 统一处理响应数据
    return handleResponseData(jsonData);
  } catch (error) {
    // 重新抛出错误，让调用方处理
    throw error;
  }
}